25.3 General raise Statement Forms
With the
addition of class-based exceptions, the raise
statement can take the following five forms: the first two raise
string exceptions, the next two raise class exceptions, and the last
reraises the current exception (useful if you need to propagate an
arbitrary exception).
raise string # Matches except with same string object
raise string, data # Pass optional extra data (default=None).
raise instance # Same as: raise instance.__class__ instance.
raise class, instance # Matches except with this class or its superclass
raise # Reraise the current exception.
For class-based exceptions, Python always requires an instance of the
class. Raising an instance really raises the
instance's class; the instance is passed along with
the class as the extra data item (it's a good place
to store information for the handler). For backward compatibility
with Python versions in which built-in exceptions were strings, you
can also use these forms of the raise statement:
raise class # Same as: raise class( )
raise class, arg # Same as: raise class(arg)
raise class, (arg, arg,...) # Same as: raise class(arg, arg,...)
These are all the same as saying raise
class(arg...), and therefore the same as the raise
instance form above. Specifically, if you list a class
instead of an instance, and the extra data item is not an instance of
the class listed, Python automatically calls the class with the extra
data items as constructor arguments to create and raise an instance
for you.
For example, you may raise an instance of the built-in
KeyError exception by saying simply raise
KeyError, even though KeyError is now a class; Python calls
KeyError to make an instance along the way. In
fact, you can raise KeyError, and any other
class-based exception, in a variety of ways:
raise KeyError( ) # Normal: raise an instance
raise KeyError, KeyError( ) # Class, instance: uses instance
raise KeyError # Class: instance will be generated
raise KeyError, "bad spam" # Class, arg: instance is generated
For all of these raise forms, a
try statement of the form:
try:
...
except KeyError, X:
...
assigns X to the KeyError
instance raised.
If that sounds confusing, just remember that exceptions may be
identified by string or class instance objects. For strings, you may
pass extra data with the exception or not. For classes, if there is
no instance object in the raise statement, Python
makes an instance for you.
|